package com.itheima.web;

import com.itheima.bean.User;
import com.itheima.common.R;
import com.itheima.service.UserService;
import com.itheima.utils.SMSUtils;
import com.itheima.utils.ValidateCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.Map;
@RequestMapping("/user")
@RestController
public class UserController {

    @Autowired
    private UserService userService;


    /**
     * 给指定的手机号码发短信【验证码】！
     *
     * @param phone
     * @return
     */
    @GetMapping("/sendCode/{phone}")
    public R sendCode(@PathVariable String phone, HttpSession session) {

        //1. 生成验证码
        String code = ValidateCodeUtils.generateValidateCode4String(4);

        //2. 调用短信API 给手机号码发短信 【假装一下！】
        //SMSUtils.sendMessage("签名" , "模板代号" , phone , code);

        //3. 需要把这个生成的验证码保存起来，以便一会登录的时候，能够识别页面传递上来的验证码对不对！
        // 保存验证码的时候，KEY 一定要写手机号，不能写固定的一个字符串！
        // 主要是为了防止一会登录的时候，使用的手机号码并不是现在获取验证码的手机号！
        session.setAttribute(phone, code);

        //4. 把短信验证码返回给页面 【在实际场景，不需要这一步！】
        return R.success(code);

    }


    /**
     * 用户登录
     *
     * @param map
     * @return
     */
    @PostMapping("/login")
    public R login(@RequestBody Map<String, String> map, HttpSession session) {

        //1. 获取手机号和验证码
        String phone = map.get("phone");
        String code = map.get("code");

        //2. 得到前面发送验证码的时候，保存的那个旧的验证码
        String validCode = (String) session.getAttribute(phone);

        //3. 比较验证码
        if (!code.equalsIgnoreCase(validCode)) {

            //3.1 如果不相等，直接返回：验证码错误，登录失败！
            return R.error("验证码错误，登录失败！");
        }


        //TODO:: 1. 登录成功之后，过滤器处于使用的状态， 页面会重定向到后台的登录页面， 这是因为在过滤器里面判定是否有登录
        // 是判定后台员工的登录。


        //TODO:: 2. 判定验证码正确之后，就要考虑把这个用户的数据留存起来【存储到数据库】工作。
        //       2.1 先根据手机号码去查询数据库，看看这个用户以前是不是有登录过，有，就把他的信息查询出来，存储到session作用
        //          以便一会就知道是谁点的餐！
        //       2.2 如果数据库里面没有这个用户的信息，那么表明这个用户是第一次来登录点餐的，此时就要执行添加的操作。把这个用户
        //          的信息保存到数据库去！

        //4. 数据库操作

        //4.1 先根据手机号码去查询数据库看看有没有这个用户存在
        User user = userService.findUser(phone);

        //4.2 判定有没有用户
        if (user != null) {
            // 表示这个用户是一个老用户，只需要把这个用户的信息保存到session作用域。
            session.setAttribute("user", user);
        } else {
            // 表示这个用户是一个新用户，第一次来！把这个用户的信息保存到数据库。还需要把这个用户的信息保存到session
            User newUser = new User();

            //设置初始数据
            newUser.setPhone(phone);
            newUser.setName("菩提阁_" + phone);

            //存储到数据库
            userService.addUser(newUser);

            //存储到session作用域
            session.setAttribute("user", newUser);
        }
        //4. 如果程序运行到了这里，那么表示验证码已经验证通过了！
        return R.success("登录成功！");


    }

    /**
     * 退出登录
     * @param session
     * @return
     */
    @PostMapping("/loginout")
    public R logout(HttpSession session) {
        try {
            session.removeAttribute("user");
            return R.success("退出成功!");
        } catch (Exception e) {
            return R.error("退出失败!");
        }
    }
}
